/*
 * H26xNaluParser.h
 *
 *  Created on: 2018年9月18日
 *      Author: zhengboyuan
 */

#ifndef H26XNALUPARSER_H_
#define H26XNALUPARSER_H_

#include "BasicType.h"
#include <string>
#include "H26xNaluType.h"

namespace av
{

class H26xNalu
{
public:
	uint8_t type;
	int prefix;
	uint8_t*    data;
	int length;
	bool isKeyFrame;

	H26xNalu():
		type(),
		prefix(),
		data(),
		length(),
		isKeyFrame()
	{
	}

	~H26xNalu()
	{
	}

};


class H26xNaluParser
{
public:
	H26xNaluParser();
	virtual ~H26xNaluParser();

    static const size_t START_CODE_LENGTH = 4;

    static const uint8_t s_startCode[START_CODE_LENGTH];

    static const uint8_t* getStartCode();

    /**
     * 判断是否以起始码开头
     * @param data
     * @param length
     * @return
     */
    static bool hasStartCode(const uint8_t* data, size_t length);

    /**
     * 检查是否有起始码, 返回起始码长度
     * @param data
     * @param length
     * @return 起始码长度. 3,4 表示起始码长度, <= 0 表示没有
     */
    static int checkStartCode(const uint8_t* data, size_t length);

    /**
     * 查找起始码
     * @param data
     * @param length
     * @param start
     * @return
     */
    static size_t findStartCode(const uint8_t* data, size_t length, size_t start);

    static void insertStartCode(std::string& data);

    static bool parseH264Nalu(uint8_t* data, size_t length, H26xNalu& nalu);

    static bool parseH265Nalu(uint8_t* data, size_t length, H26xNalu& nalu);

    /**
     * 十六进制转换为字节数组
     * @param hexStr
     * @param data
     * @return
     */
    static size_t hexToData(const std::string& hexStr, std::string& data);


};


} /* namespace av */

#endif /* H26XNALUPARSER_H_ */
